<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/pid.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/pid.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX1BJRF9IXzA_"><span class="b">_LINUX_PID_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX1BJRF9IXzA_"><span class="b">_LINUX_PID_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">rcupdate</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="Maybe">       5:</span> 
<a name="6" /><span class="Maybe">       6:</span> <span class="m">enum</span> <span class="b">pid_type</span>
<a name="7" /><span class="Maybe">       7:</span> <span class="f">{</span>
<a name="8" /><span class="Maybe">       8:</span>     <span class="b">PIDTYPE_PID</span><span class="f">,</span>
<a name="9" /><span class="Maybe">       9:</span>     <span class="b">PIDTYPE_PGID</span><span class="f">,</span>
<a name="10" /><span class="Maybe">      10:</span>     <span class="b">PIDTYPE_SID</span><span class="f">,</span>
<a name="11" /><span class="Maybe">      11:</span>     <span class="b">PIDTYPE_MAX</span>
<a name="12" /><span class="Maybe">      12:</span> <span class="f">}</span><span class="f">;</span>
<a name="13" /><span class="Maybe">      13:</span> 
<a name="14" /><span class="Maybe">      14:</span> <span class="k">/*</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="k"> * What is struct pid?</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="k"> *</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="k"> * A struct pid is the kernel&apos;s internal notion of a process identifier.</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="k"> * It refers to individual tasks, process groups, and sessions.  While</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="k"> * there are processes attached to it the struct pid lives in a hash</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="k"> * table, so it and then the processes that it refers to can be found</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="k"> * quickly from the numeric pid value.  The attached processes may be</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="k"> * quickly accessed by following pointers from struct pid.</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="k"> *</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="k"> * Storing pid_t values in the kernel and referring to them later has a</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="k"> * problem.  The process originally with that pid may have exited and the</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="k"> * pid allocator wrapped, and another process could have come along</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="k"> * and been assigned that pid.</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="k"> *</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="k"> * Referring to user space processes by holding a reference to struct</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="k"> * task_struct has a problem.  When the user space process exits</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="k"> * the now useless task_struct is still kept.  A task_struct plus a</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="k"> * stack consumes around 10K of low kernel memory.  More precisely</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="k"> * this is THREAD_SIZE + sizeof(struct task_struct).  By comparison</span>
<a name="34" /><span class="Maybe">      34:</span> <span class="k"> * a struct pid is about 64 bytes.</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="k"> *</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="k"> * Holding a reference to struct pid solves both of these problems.</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> * It is small so holding a reference does not consume a lot of</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> * resources, and since a new struct pid is allocated when the numeric pid</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> * value is reused (when pids wrap around) we don&apos;t mistakenly refer to new</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="k"> * processes.</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="k"> */</span>
<a name="42" /><span class="Maybe">      42:</span> 
<a name="43" /><span class="Maybe">      43:</span> 
<a name="44" /><span class="Maybe">      44:</span> <span class="k">/*</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="k"> * struct upid is used to get the id of the struct pid, as it is</span>
<a name="46" /><span class="Maybe">      46:</span> <span class="k"> * seen in particular namespace. Later the struct pid is found with</span>
<a name="47" /><span class="Maybe">      47:</span> <span class="k"> * find_pid_ns() using the int nr and struct pid_namespace *ns.</span>
<a name="48" /><span class="Maybe">      48:</span> <span class="k"> */</span>
<a name="49" /><span class="Maybe">      49:</span> 
<a name="50" /><span class="Maybe">      50:</span> <span class="m">struct</span> <span class="b">upid</span> <span class="f">{</span>
<a name="51" /><span class="Maybe">      51:</span>     <span class="k">/* Try to keep pid_chain in the same cacheline as nr for find_vpid */</span>
<a name="52" /><span class="Maybe">      52:</span>     <span class="m">int</span> <span class="b">nr</span><span class="f">;</span>
<a name="53" /><span class="Maybe">      53:</span>     <span class="m">struct</span> <span class="b">pid_namespace</span> <span class="f">*</span><span class="b">ns</span><span class="f">;</span>
<a name="54" /><span class="Maybe">      54:</span>     <span class="m">struct</span> <span class="b">hlist_node</span> <span class="b">pid_chain</span><span class="f">;</span>
<a name="55" /><span class="Maybe">      55:</span> <span class="f">}</span><span class="f">;</span>
<a name="56" /><span class="Maybe">      56:</span> 
<a name="57" /><span class="Maybe">      57:</span> <span class="m">struct</span> <span class="b">pid</span>
<a name="58" /><span class="Maybe">      58:</span> <span class="f">{</span>
<a name="59" /><span class="Maybe">      59:</span>     <span class="b">atomic_t</span> <span class="b">count</span><span class="f">;</span>
<a name="60" /><span class="Maybe">      60:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">level</span><span class="f">;</span>
<a name="61" /><span class="Maybe">      61:</span>     <span class="k">/* lists of tasks that use this pid */</span>
<a name="62" /><span class="Maybe">      62:</span>     <span class="m">struct</span> <span class="b">hlist_head</span> <span class="b">tasks</span><span class="f">[</span><span class="b">PIDTYPE_MAX</span><span class="f">]</span><span class="f">;</span>
<a name="63" /><span class="Maybe">      63:</span>     <span class="m">struct</span> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a> <span class="b">rcu</span><span class="f">;</span>
<a name="64" /><span class="Maybe">      64:</span>     <span class="m">struct</span> <span class="b">upid</span> <span class="b">numbers</span><span class="f">[</span><span class="c">1</span><span class="f">]</span><span class="f">;</span>
<a name="65" /><span class="Maybe">      65:</span> <span class="f">}</span><span class="f">;</span>
<a name="66" /><span class="Maybe">      66:</span> 
<a name="67" /><span class="Maybe">      67:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pid</span> <span class="b">init_struct_pid</span><span class="f">;</span>
<a name="68" /><span class="Maybe">      68:</span> 
<a name="69" /><span class="Maybe">      69:</span> <span class="m">struct</span> <span class="b">pid_link</span>
<a name="70" /><span class="Maybe">      70:</span> <span class="f">{</span>
<a name="71" /><span class="Maybe">      71:</span>     <span class="m">struct</span> <span class="b">hlist_node</span> <span class="b">node</span><span class="f">;</span>
<a name="72" /><span class="Maybe">      72:</span>     <span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">;</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="f">}</span><span class="f">;</span>
<a name="74" /><span class="Maybe">      74:</span> 
<a name="75" /><span class="Maybe">      75:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">get_pid</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">)</span>
<a name="76" /><span class="Maybe">      76:</span> <span class="f">{</span>
<a name="77" /><span class="Maybe">      77:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">pid</span><span class="f">)</span>
<a name="78" /><span class="Maybe">      78:</span>         <span class="b">atomic_inc</span><span class="f">(</span><span class="f">&amp;</span><span class="b">pid</span><span class="f">-&gt;</span><span class="b">count</span><span class="f">)</span><span class="f">;</span>
<a name="79" /><span class="Maybe">      79:</span>     <span class="m">return</span> <span class="b">pid</span><span class="f">;</span>
<a name="80" /><span class="Maybe">      80:</span> <span class="f">}</span>
<a name="81" /><span class="Maybe">      81:</span> 
<a name="82" /><span class="Maybe">      82:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">put_pid</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">)</span><span class="f">;</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">pid_task</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">,</span> <span class="m">enum</span> <span class="b">pid_type</span><span class="f">)</span><span class="f">;</span>
<a name="84" /><span class="Maybe">      84:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">get_pid_task</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">,</span> <span class="m">enum</span> <span class="b">pid_type</span><span class="f">)</span><span class="f">;</span>
<a name="85" /><span class="Maybe">      85:</span> 
<a name="86" /><span class="Maybe">      86:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">get_task_pid</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">,</span> <span class="m">enum</span> <span class="b">pid_type</span> <span class="b">type</span><span class="f">)</span><span class="f">;</span>
<a name="87" /><span class="Maybe">      87:</span> 
<a name="88" /><span class="Maybe">      88:</span> <span class="k">/*</span>
<a name="89" /><span class="Maybe">      89:</span> <span class="k"> * these helpers must be called with the tasklist_lock write-held.</span>
<a name="90" /><span class="Maybe">      90:</span> <span class="k"> */</span>
<a name="91" /><span class="Maybe">      91:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">attach_pid</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">,</span> <span class="m">enum</span> <span class="b">pid_type</span><span class="f">)</span><span class="f">;</span>
<a name="92" /><span class="Maybe">      92:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">detach_pid</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">,</span> <span class="m">enum</span> <span class="b">pid_type</span><span class="f">)</span><span class="f">;</span>
<a name="93" /><span class="Maybe">      93:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">change_pid</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">,</span> <span class="m">enum</span> <span class="b">pid_type</span><span class="f">,</span>
<a name="94" /><span class="Maybe">      94:</span>             <span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">)</span><span class="f">;</span>
<a name="95" /><span class="Maybe">      95:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">transfer_pid</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">old</span><span class="f">,</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="m">new</span><span class="f">,</span>
<a name="96" /><span class="Maybe">      96:</span>              <span class="m">enum</span> <span class="b">pid_type</span><span class="f">)</span><span class="f">;</span>
<a name="97" /><span class="Maybe">      97:</span> 
<a name="98" /><span class="Maybe">      98:</span> <span class="m">struct</span> <span class="b">pid_namespace</span><span class="f">;</span>
<a name="99" /><span class="Maybe">      99:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pid_namespace</span> <span class="b">init_pid_ns</span><span class="f">;</span>
<a name="100" /><span class="Maybe">     100:</span> 
<a name="101" /><span class="Maybe">     101:</span> <span class="k">/*</span>
<a name="102" /><span class="Maybe">     102:</span> <span class="k"> * look up a PID in the hash table. Must be called with the tasklist_lock</span>
<a name="103" /><span class="Maybe">     103:</span> <span class="k"> * or rcu_read_lock() held.</span>
<a name="104" /><span class="Maybe">     104:</span> <span class="k"> *</span>
<a name="105" /><span class="Maybe">     105:</span> <span class="k"> * find_pid_ns() finds the pid in the namespace specified</span>
<a name="106" /><span class="Maybe">     106:</span> <span class="k"> * find_vpid() finds the pid by its virtual id, i.e. in the current namespace</span>
<a name="107" /><span class="Maybe">     107:</span> <span class="k"> *</span>
<a name="108" /><span class="Maybe">     108:</span> <span class="k"> * see also find_task_by_vpid() set in include/linux/sched.h</span>
<a name="109" /><span class="Maybe">     109:</span> <span class="k"> */</span>
<a name="110" /><span class="Maybe">     110:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">find_pid_ns</span><span class="f">(</span><span class="m">int</span> <span class="b">nr</span><span class="f">,</span> <span class="m">struct</span> <span class="b">pid_namespace</span> <span class="f">*</span><span class="b">ns</span><span class="f">)</span><span class="f">;</span>
<a name="111" /><span class="Maybe">     111:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">find_vpid</span><span class="f">(</span><span class="m">int</span> <span class="b">nr</span><span class="f">)</span><span class="f">;</span>
<a name="112" /><span class="Maybe">     112:</span> 
<a name="113" /><span class="Maybe">     113:</span> <span class="k">/*</span>
<a name="114" /><span class="Maybe">     114:</span> <span class="k"> * Lookup a PID in the hash table, and return with it&apos;s count elevated.</span>
<a name="115" /><span class="Maybe">     115:</span> <span class="k"> */</span>
<a name="116" /><span class="Maybe">     116:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">find_get_pid</span><span class="f">(</span><span class="m">int</span> <span class="b">nr</span><span class="f">)</span><span class="f">;</span>
<a name="117" /><span class="Maybe">     117:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">find_ge_pid</span><span class="f">(</span><span class="m">int</span> <span class="b">nr</span><span class="f">,</span> <span class="m">struct</span> <span class="b">pid_namespace</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="118" /><span class="Maybe">     118:</span> <span class="m">int</span> <span class="b">next_pidmap</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid_namespace</span> <span class="f">*</span><span class="b">pid_ns</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">last</span><span class="f">)</span><span class="f">;</span>
<a name="119" /><span class="Maybe">     119:</span> 
<a name="120" /><span class="Maybe">     120:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">alloc_pid</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid_namespace</span> <span class="f">*</span><span class="b">ns</span><span class="f">)</span><span class="f">;</span>
<a name="121" /><span class="Maybe">     121:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">free_pid</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">)</span><span class="f">;</span>
<a name="122" /><span class="Maybe">     122:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">disable_pid_allocation</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid_namespace</span> <span class="f">*</span><span class="b">ns</span><span class="f">)</span><span class="f">;</span>
<a name="123" /><span class="Maybe">     123:</span> 
<a name="124" /><span class="Maybe">     124:</span> <span class="k">/*</span>
<a name="125" /><span class="Maybe">     125:</span> <span class="k"> * ns_of_pid() returns the pid namespace in which the specified pid was</span>
<a name="126" /><span class="Maybe">     126:</span> <span class="k"> * allocated.</span>
<a name="127" /><span class="Maybe">     127:</span> <span class="k"> *</span>
<a name="128" /><span class="Maybe">     128:</span> <span class="k"> * NOTE:</span>
<a name="129" /><span class="Maybe">     129:</span> <span class="k"> *     ns_of_pid() is expected to be called for a process (task) that has</span>
<a name="130" /><span class="Maybe">     130:</span> <span class="k"> *     an attached &apos;struct pid&apos; (see attach_pid(), detach_pid()) i.e @pid</span>
<a name="131" /><span class="Maybe">     131:</span> <span class="k"> *     is expected to be non-NULL. If @pid is NULL, caller should handle</span>
<a name="132" /><span class="Maybe">     132:</span> <span class="k"> *     the resulting NULL pid-ns.</span>
<a name="133" /><span class="Maybe">     133:</span> <span class="k"> */</span>
<a name="134" /><span class="Maybe">     134:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">pid_namespace</span> <span class="f">*</span><span class="b">ns_of_pid</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">)</span>
<a name="135" /><span class="Maybe">     135:</span> <span class="f">{</span>
<a name="136" /><span class="Maybe">     136:</span>     <span class="m">struct</span> <span class="b">pid_namespace</span> <span class="f">*</span><span class="b">ns</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">;</span>
<a name="137" /><span class="Maybe">     137:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">pid</span><span class="f">)</span>
<a name="138" /><span class="Maybe">     138:</span>         <span class="b">ns</span> <span class="f">=</span> <span class="b">pid</span><span class="f">-&gt;</span><span class="b">numbers</span><span class="f">[</span><span class="b">pid</span><span class="f">-&gt;</span><span class="b">level</span><span class="f">]</span><span class="f">.</span><span class="b">ns</span><span class="f">;</span>
<a name="139" /><span class="Maybe">     139:</span>     <span class="m">return</span> <span class="b">ns</span><span class="f">;</span>
<a name="140" /><span class="Maybe">     140:</span> <span class="f">}</span>
<a name="141" /><span class="Maybe">     141:</span> 
<a name="142" /><span class="Maybe">     142:</span> <span class="k">/*</span>
<a name="143" /><span class="Maybe">     143:</span> <span class="k"> * is_child_reaper returns true if the pid is the init process</span>
<a name="144" /><span class="Maybe">     144:</span> <span class="k"> * of the current namespace. As this one could be checked before</span>
<a name="145" /><span class="Maybe">     145:</span> <span class="k"> * pid_ns-&gt;child_reaper is assigned in copy_process, we check</span>
<a name="146" /><span class="Maybe">     146:</span> <span class="k"> * with the pid number.</span>
<a name="147" /><span class="Maybe">     147:</span> <span class="k"> */</span>
<a name="148" /><span class="Maybe">     148:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">bool</span> <span class="b">is_child_reaper</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">)</span>
<a name="149" /><span class="Maybe">     149:</span> <span class="f">{</span>
<a name="150" /><span class="Maybe">     150:</span>     <span class="m">return</span> <span class="b">pid</span><span class="f">-&gt;</span><span class="b">numbers</span><span class="f">[</span><span class="b">pid</span><span class="f">-&gt;</span><span class="b">level</span><span class="f">]</span><span class="f">.</span><span class="b">nr</span> <span class="f">==</span> <span class="c">1</span><span class="f">;</span>
<a name="151" /><span class="Maybe">     151:</span> <span class="f">}</span>
<a name="152" /><span class="Maybe">     152:</span> 
<a name="153" /><span class="Maybe">     153:</span> <span class="k">/*</span>
<a name="154" /><span class="Maybe">     154:</span> <span class="k"> * the helpers to get the pid&apos;s id seen from different namespaces</span>
<a name="155" /><span class="Maybe">     155:</span> <span class="k"> *</span>
<a name="156" /><span class="Maybe">     156:</span> <span class="k"> * pid_nr()    : global id, i.e. the id seen from the init namespace;</span>
<a name="157" /><span class="Maybe">     157:</span> <span class="k"> * pid_vnr()   : virtual id, i.e. the id seen from the pid namespace of</span>
<a name="158" /><span class="Maybe">     158:</span> <span class="k"> *               current.</span>
<a name="159" /><span class="Maybe">     159:</span> <span class="k"> * pid_nr_ns() : id seen from the ns specified.</span>
<a name="160" /><span class="Maybe">     160:</span> <span class="k"> *</span>
<a name="161" /><span class="Maybe">     161:</span> <span class="k"> * see also task_xid_nr() etc in include/linux/sched.h</span>
<a name="162" /><span class="Maybe">     162:</span> <span class="k"> */</span>
<a name="163" /><span class="Maybe">     163:</span> 
<a name="164" /><span class="Maybe">     164:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">pid_t</span> <span class="b">pid_nr</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">)</span>
<a name="165" /><span class="Maybe">     165:</span> <span class="f">{</span>
<a name="166" /><span class="Maybe">     166:</span>     <span class="b">pid_t</span> <span class="b">nr</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span>
<a name="167" /><span class="Maybe">     167:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">pid</span><span class="f">)</span>
<a name="168" /><span class="Maybe">     168:</span>         <span class="b">nr</span> <span class="f">=</span> <span class="b">pid</span><span class="f">-&gt;</span><span class="b">numbers</span><span class="f">[</span><span class="c">0</span><span class="f">]</span><span class="f">.</span><span class="b">nr</span><span class="f">;</span>
<a name="169" /><span class="Maybe">     169:</span>     <span class="m">return</span> <span class="b">nr</span><span class="f">;</span>
<a name="170" /><span class="Maybe">     170:</span> <span class="f">}</span>
<a name="171" /><span class="Maybe">     171:</span> 
<a name="172" /><span class="Maybe">     172:</span> <span class="b">pid_t</span> <span class="b">pid_nr_ns</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">,</span> <span class="m">struct</span> <span class="b">pid_namespace</span> <span class="f">*</span><span class="b">ns</span><span class="f">)</span><span class="f">;</span>
<a name="173" /><span class="Maybe">     173:</span> <span class="b">pid_t</span> <span class="b">pid_vnr</span><span class="f">(</span><span class="m">struct</span> <span class="b">pid</span> <span class="f">*</span><span class="b">pid</span><span class="f">)</span><span class="f">;</span>
<a name="174" /><span class="Maybe">     174:</span> 
<a name="175" /><span class="Maybe">     175:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_ZG9fZWFjaF9waWRfdGFza18w"><span class="b">do_each_pid_task</span></a><span class="f">(</span><span class="b">pid</span><span class="f">,</span> <span class="b">type</span><span class="f">,</span> <span class="b">task</span><span class="f">)</span>                \
<a name="176" /><span class="Maybe">     176:</span>     <span class="m">do</span> <span class="f">{</span>                                \
<a name="177" /><span class="Maybe">     177:</span>         <span class="m">if</span> <span class="f">(</span><span class="f">(</span><span class="b">pid</span><span class="f">)</span> <span class="f">!=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">)</span>                    \
<a name="178" /><span class="Maybe">     178:</span>             <a href="cpu.c_macros_noref.html#_aGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1XzA_"><span class="b">hlist_for_each_entry_rcu</span></a><span class="f">(</span><span class="f">(</span><span class="b">task</span><span class="f">)</span><span class="f">,</span>        \
<a name="179" /><span class="Maybe">     179:</span>                 <span class="f">&amp;</span><span class="f">(</span><span class="b">pid</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">tasks</span><span class="f">[</span><span class="b">type</span><span class="f">]</span><span class="f">,</span> <span class="b">pids</span><span class="f">[</span><span class="b">type</span><span class="f">]</span><span class="f">.</span><span class="b">node</span><span class="f">)</span> <span class="f">{</span>
<a name="180" /><span class="Maybe">     180:</span> 
<a name="181" /><span class="Maybe">     181:</span>             <span class="k">/*</span>
<a name="182" /><span class="Maybe">     182:</span> <span class="k">             * Both old and new leaders may be attached to</span>
<a name="183" /><span class="Maybe">     183:</span> <span class="k">             * the same pid in the middle of de_thread().</span>
<a name="184" /><span class="Maybe">     184:</span> <span class="k">             */</span>
<a name="185" /><span class="Maybe">     185:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_d2hpbGVfZWFjaF9waWRfdGFza18w"><span class="b">while_each_pid_task</span></a><span class="f">(</span><span class="b">pid</span><span class="f">,</span> <span class="b">type</span><span class="f">,</span> <span class="b">task</span><span class="f">)</span>                \
<a name="186" /><span class="Maybe">     186:</span>                 <span class="m">if</span> <span class="f">(</span><span class="b">type</span> <span class="f">==</span> <span class="b">PIDTYPE_PID</span><span class="f">)</span>        \
<a name="187" /><span class="Maybe">     187:</span>                     <span class="m">break</span><span class="f">;</span>                \
<a name="188" /><span class="Maybe">     188:</span>             <span class="f">}</span>                        \
<a name="189" /><span class="Maybe">     189:</span>     <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="190" /><span class="Maybe">     190:</span> 
<a name="191" /><span class="Maybe">     191:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_ZG9fZWFjaF9waWRfdGhyZWFkXzA_"><span class="b">do_each_pid_thread</span></a><span class="f">(</span><span class="b">pid</span><span class="f">,</span> <span class="b">type</span><span class="f">,</span> <span class="b">task</span><span class="f">)</span>                \
<a name="192" /><span class="Maybe">     192:</span>     <a href="cpu.c_macros_noref.html#_ZG9fZWFjaF9waWRfdGFza18w"><span class="b">do_each_pid_task</span></a><span class="f">(</span><span class="b">pid</span><span class="f">,</span> <span class="b">type</span><span class="f">,</span> <span class="b">task</span><span class="f">)</span> <span class="f">{</span>                \
<a name="193" /><span class="Maybe">     193:</span>         <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">tg___</span> <span class="f">=</span> <span class="b">task</span><span class="f">;</span>            \
<a name="194" /><span class="Maybe">     194:</span>         <span class="m">do</span> <span class="f">{</span>
<a name="195" /><span class="Maybe">     195:</span> 
<a name="196" /><span class="Maybe">     196:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_d2hpbGVfZWFjaF9waWRfdGhyZWFkXzA_"><span class="b">while_each_pid_thread</span></a><span class="f">(</span><span class="b">pid</span><span class="f">,</span> <span class="b">type</span><span class="f">,</span> <span class="b">task</span><span class="f">)</span>                \
<a name="197" /><span class="Maybe">     197:</span>         <span class="f">}</span> <a href="cpu.c_macros_noref.html#_d2hpbGVfZWFjaF90aHJlYWRfMA__"><span class="b">while_each_thread</span></a><span class="f">(</span><span class="b">tg___</span><span class="f">,</span> <span class="b">task</span><span class="f">)</span><span class="f">;</span>            \
<a name="198" /><span class="Maybe">     198:</span>         <span class="b">task</span> <span class="f">=</span> <span class="b">tg___</span><span class="f">;</span>                        \
<a name="199" /><span class="Maybe">     199:</span>     <span class="f">}</span> <a href="cpu.c_macros_noref.html#_d2hpbGVfZWFjaF9waWRfdGFza18w"><span class="b">while_each_pid_task</span></a><span class="f">(</span><span class="b">pid</span><span class="f">,</span> <span class="b">type</span><span class="f">,</span> <span class="b">task</span><span class="f">)</span>
<a name="200" /><span class="True">     200:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _LINUX_PID_H */</span>
<a name="201" /><span class="True">     201:</span> </pre>
  </body>
</html>
